<?php
//写一个递归计算所用单元的和

/*
class Hu{
 public  $arr = array(1,2,3,array(4,5,array(6,7)),10);
 public  $sum = 0;
 public function sum(){
    echo "开始1",$this->sum,"<br />";
     foreach ($this->arr as  $v) {
         if(is_array($v)){
           print_r($v);            echo "<br />";
             function sss($ar,$s){
              echo "方法2 ",$s,"<br />";
                 foreach ($ar as $value) {
                     if(is_array($value)){
                          $s = sss($value,$s);
                               echo "方法2里面 ",$s,"<br />";
                     }else{
                       $s = $s +  $value;
                        // echo "方法2esle",$s,"<br />";    echo "<br />";
                         // $this->sum = $this->sum + $value;
                       }
                 }
                 echo "方法2endd",$s,"<br />";
                 return $s;
             }

                 $this->sum = sss($v,$this->sum);
                 echo "方法1调用方法2 ",$this->sum,"<br />";
          }else{
            $this->sum = $this->sum +  $v;
            // echo $this->sum,"<br />";
         }
    }

}

}
  $data = new Hu();
  $data->sum();
  echo $data->sum,"<br />";
*/

//法二：
/**
   $arr = array(1,2,3,array(4,5,array(6,7)),10,5);
   function sum($a){
        static $sum = 0;
        foreach ($a as $v) {
           print_r($v);   echo "开始"."<br />";
           if(is_array($v)){
                sum($v);
                // echo 'if 里面',$sum,"<br />";
           }else{
            $sum = $sum + $v;
            // echo "else里面",$sum,"<br />";
           }

        }
   }
   sum($arr);
**/

//打印级联目录
// var_dump(dir('./'));
// $fh = dir('./');
// while ($fil = $fh->read()) {
//     if($fil == "." || $fil == ".."){
//          continue;
//     }
//     print_r($fil);
//    echo "<br />";
//    if(is_dir($fil)){
//          mau($fil,$fh);
//    }
// }

// function mau($f,$fh){
//   // echo '我是mau',$mun;
//     while($ff = $->read()){
//          echo "<br />";
//          print_r(" ".$ff);
//          echo "<br />";
//         if(is_dir($fh . '/' . $f)){
//           mau($ff,$fh);
//   }
//      }
// }

// 打印级联目录   法二：
/**
function lu($fh,$lev=1){
  $ff = opendir($fh);
    while(($file = readdir($ff)) != false) {
         if($file == '.' || $file == '..'){       //去除虚拟目录
               continue;
         }
         print_r('|-' . str_repeat("--" , $lev) . $file);   
         echo "<br />";
         if(is_dir($fh . '/' . $file)){
              lu($fh . '/' . $file,$lev+1);    //参数$lev的作用 ： 显示层级
         }
    }
    closedir($ff);
}
lu('./');
**/

/**
  作业：
        创建级联目录
        按日期好创建目录

        array(
            1=>array('安徽',0),
            2=>array('北京',0),
            3=>array('淮北',2),
            4=>array('哈哈',4);
         )

-----无限极分类

**/

//  $ar = array(
//             1=>array('安徽',0),
//             2=>array('北京',0),
//             3=>array('淮北',2),
//             4=>array('哈哈',4),
//          );
// foreach ($ar as $key => $value) {
//        print_r($value);
//        echo "<br />";
//      foreach ($value as $k => $v) {
//           // print_r($v);
//           echo "<br />";
//      }
// }

//一下创建级联目录
// echo  mkdir('./b/c') ? " 创建成功 " : " error ";       //如果当前目录下没有b目录，这么写会报错 
/**
function cre($url){
       $mau = explode('/',$url);
       // print_r($mau);          echo "<br />";
      foreach ($mau as $key => $value) {
              $new = "";
              for($i = 0; $i <= $key;$i++){
                       $new  =  $new . $mau[$i] . '/' ;
              }
                 echo  is_dir($new)?"我是真的<br />":"假的<br />";
                  if(!is_dir($new)){
                       mkdir($new);
                       echo "链接".$new , "<br />";
                  }                          
      }
}
cre('./qqq/wwww/xxss/hhh');
**/

//递归创建级联目录 法一
/**
function mk($path){
    if(is_dir($path)){
          return true;
    }
    if(is_dir(dirname($path))){    //dirname($path)取得是该path的父目录
          return mkdir($path);
    }
    mk(dirname($path));
         mkdir($path);
}
mk('./yy//uu/ii/oo');
**/

//递归创建级联目录 法二
/**
function mk($path){
       if(is_dir($path)){        //如果运气好，要创建的目录存在
             return true;
       }

    return   is_dir(dirname($path)) ||  mk(dirname($path)) ? mkdir($path) : false;
}
echo  mk('./hhh//uu/ii/oo')? 'ok' : 'fall';
**/

/**
     print_r(scandir('./',1));   //列出指定路径中的文件和目录 ,后面的1表示排序
**/

/**
    注意：上面的两种创建递归级联目录的方法，是为了练习递归
    实际项目中没必要如此，
     PHP5的mkdir 函数，自身就能够创建级联目录
**/
// echo mkdir('./aa/bb/cc' , 0777 , true) ?  'ok' : 'fall';


//递归删除目录
/**
function del($path){
  if(!is_dir($path)){
       return NULL;
  }
  $dh = opendir($path);
  while (($row = readdir($dh)) !== false) {
      if($row == '.' || $row == '..'){
          continue;
      }

      //判断文件是否是目录
      if(!is_dir($path . '/' .$row)){
            unlink($path.'/'.$row);   //unlink是删文件
      }else{  
          del($path.'/'.$row);   //递归把子目录/文件删了
            echo '删了',$row,"<br />";
      }

    // rmdir($path.'/'.$row);   //rmdir 是删除目录; 
  }

   echo $path , "<br />";
   closedir($dh);
    rmdir($path.'/'.$row);   //rmdir 是删除目录; 

   return  true;
}
echo del('./jjjj');
**/

/**
     递归与迭代

       迭代：就是指在某个范围内，反复执行相同的工作
       递归：把大的任务拆成相同性质的多个小任务

       理论上：(借助栈)递归都是可以转化为迭代的
*/

/**
    用迭代创建级联目录
  
**/
//法一： 我的办法
/**
function cre($path){
      $arr = [];
      if(is_dir($path)){
             return true;
        }

      $paren = dirname($path);
      while(!is_dir($paren)){
         print_r($paren);  echo "<br />";  
         array_push($arr, $paren);
          $paren = dirname($paren); 
      }

      krsort($arr);    //对数组$arr按照键名逆向排序 
      print_r($arr);

        foreach ($arr as $key => $value) {
             mkdir($value);
        }

      if(is_dir(dirname($path))){
               mkdir($path);
        }
        return true;
}

cre('./xxxx/uu/ii/oo');

**/

//法二： 老师的办法
/**
function cre($path){
      $arr = [];

      while(!is_dir($path)){
          array_unshift($arr,$path);
          $path = dirname($path);
      }

   print_r($arr);

      if(empty($arr)){
            return true;
      }

      foreach ($arr as $key => $value) {
          mkdir($value);
      }
      return true;
}
cre('./rrrr/ggg/hhh/dddd');
**/


/**
    递归对数组进行转义
**/
// $arr = array('a"b' , array("c'd" , array('e"f')));
// print_r($arr); echo "<br />";
// function _addslashes($arr){
//      foreach ($arr as $k => $v) {
//         if(is_string($v)){
//               $arr[$k] = addslashes($v);
//         }elseif (is_array($v)) {
//             $arr[$k] = _addslashes($v);
//         }
//      }
//      print_r($arr);
// }
// _addslashes($arr);
// print_r($_GET);



/**
    用递归 实现 

     无限极分类  求子孙树
**/
// parent 的值，是该栏目的父栏ID
$area = array(
array('id'=>1,'name'=>'安徽','parent'=>0),
array('id'=>2,'name'=>'海淀','parent'=>7),
array('id'=>3,'name'=>'溪县','parent'=>5),
array('id'=>4,'name'=>'昌平','parent'=>7),
array('id'=>5,'name'=>'淮北','parent'=>1),
array('id'=>6,'name'=>'朝阳','parent'=>7),
array('id'=>7,'name'=>'北京','parent'=>0),
array('id'=>8,'name'=>'上地','parent'=>2),
  );

// function tree($arr,$id=0,$lev=1){
//       static $sons = array();      // 用静态变量
//       foreach ($arr as $value) {
//          if($value['parent'] == $id){
//               $value['num'] = $lev;
//               $sons[] = $value;
//               tree($arr,$value['id'],$lev+1);   //找该目录下的子目录
//          }
//       }
//       return $sons;
// }
//  $trees =  tree($area);
//   foreach ($trees as $key => $value) {
//         print_r(str_repeat('&nbsp;&nbsp;',$value['num']) .$value['name']);   echo "<br />";
//   }


/**
     用递归   实现
    无限极分类  求家谱树
**/

// function hometree($arr,$id=8){
//       $tree = array();
//       foreach ($arr as $v) {
//          if($id == $v['id']){
//              if($v['parent'] > 0){
//                $tree = array_merge($tree,hometree($arr,$v['parent']));  //不用静态方法， 可以用array_merge()合并两个数组,, 用array_push 就变成多维数组了。
//              }
//               $tree[] = $v;
//          }
//       }
//       return $tree;
// }
// print_r(hometree($area));


/**  
     用迭代来找家谱树
     迭代, 效率比递归高，代码也没多，
     找家谱树推荐用迭代
**/
/**
function homes($arr,$id=8){
   $tree = array();
    foreach ($arr as $value) {
         if($id == $value['id']){
             $tree[] = $value;      
              while ($value['parent'] > 0) {                 
                  foreach ($arr as $v) {                
                      if($v['id'] == $value['parent']){
                            $tree[] = $v;
                            $value['parent'] = $v['parent'];
                      } 
                  }
             }
         }
    }
    return $tree;
}
print_r(homes($area));
**/

/**
    如何用迭代法，找一个栏目的子孙树呢？
    提示，可以用任务栈来帮忙。
 $area = array(
array('id'=>1,'name'=>'安徽','parent'=>0),
array('id'=>2,'name'=>'海淀','parent'=>7),
array('id'=>3,'name'=>'溪县','parent'=>5),
array('id'=>4,'name'=>'昌平','parent'=>7),
array('id'=>5,'name'=>'淮北','parent'=>1),
array('id'=>6,'name'=>'朝阳','parent'=>7),
array('id'=>7,'name'=>'北京','parent'=>0),
array('id'=>8,'name'=>'上地','parent'=>2),
  );
**/
/**
function subtree($arr,$parent=0){
     $task= array($parent);     //任务表
     $tree = array();     //地区表
     while (!empty($task)) {
         $flag = false;
         foreach ($arr as $k => $v) {
              print_r($parent); echo "<br />";
            if($v['parent'] == $parent){
                 $tree[] = $v;
                 array_push($task,$v['id']);
                 $parent = $v['id'];
                 unset($arr[$k]);
                 $flag = true;
            }
         }
echo "我是分割线";echo "<br />";
         if($flag == false){
               array_pop($task);
               $parent = end($task);
         }
     }
     return $tree;
}
print_r(subtree($area,0))
**/



//链接数据库传数据

$conn = mysqli_connect('localhost','root','');
var_dump(mysqli_query($conn,"use boolshop"));
var_dump(mysqli_query($conn,"set names utf8"));
// $sql = 'insert into categorys value( '. rand(1,10000) . ',"丰富的房价","方法就是",1)';
$sql = 'select * from categorys';
// print_r($sql);
 $data = mysqli_query($conn,$sql);
 
var_dump($data);



?>